package com.jf.cloud.service.sysmanager.remote;

import java.io.IOException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.jf.cloud.service.sysmanager.common.base.AjaxPageData;
import com.jf.cloud.service.sysmanager.common.base.OPaging;
import com.jf.cloud.service.sysmanager.common.db.Query;
import com.jf.cloud.service.sysmanager.common.util.MD5;
import com.jf.cloud.service.sysmanager.dao.ISysRoleService;
import com.jf.cloud.service.sysmanager.dao.ISysRoleTypeService;
import com.jf.cloud.service.sysmanager.dao.ISysStaffService;
import com.jf.cloud.service.sysmanager.entity.SysStaff;
import com.jf.cloud.service.sysmanager.support.web.BaseController;

@Controller
@RequestMapping("/staff")
public class StaffController extends BaseController {
	
	private static Log log = LogFactory.getLog(StaffController.class);
	
	@Resource
	private ISysStaffService staffService;
	
	@Resource
	private ISysRoleService roleService;

	@Resource
	private ISysRoleTypeService roleTypeService;
	
	/**
	 * 列表页面跳转
	 * 
	 * @author 朱建文 创建时间：2017年12月6日 下午8:36:23
	 */
	@RequestMapping("/list")
	public String list(HttpServletRequest request){
		Integer flag = this.getParamValueInteger(request, "flag", 0);
		if (Integer.valueOf(1).equals(flag)) {
			request.setAttribute("msg", "添加成功");
		}
		try {
			request.setAttribute("roleNameList", getJSONDict(roleService.findForTags("ROLE_NAME", "ROW_ID", new Query())));
		} catch (IOException e) {
			log.error("到员工管理页面出错了", e);
			request.setAttribute("msg", "到员工管理页面出错了!");
		}
		return "jsp/system/staff_list";
	}
	
	/**
	 * 列表页面数据获取
	 * 
	 * @author 朱建文 创建时间：2017年12月6日 下午3:50:48
	 */
	@ResponseBody
	@RequestMapping("/staff.json")
	public  AjaxPageData<SysStaff> list_json (HttpServletRequest request, OPaging<SysStaff> page) {  
		page.getWm().put("DEL_FLAG", "0");//只获取未删除的员工

		return getAjaxPageData(staffService.findPage(page));
	}
	
	/**
	 * 获取添加/修改页面
	 * 
	 * @author 朱建文 创建时间：2017年12月6日 下午3:50:22
	 */
	@RequestMapping("/editor")
	public String editor(HttpServletRequest request,HttpServletResponse response,Long uid) {
		try {
			if(uid!=null && uid>0){ //修改  使用
				SysStaff staff = staffService.findByPK(uid);
				request.setAttribute("userEdit", staff); 
			}
		} catch (Exception e) {
			log.error("获取添加/修改页面", e);
		}
		return "jsp/system/staff_editor";
	}
	
	/**
	 * 新增员工
	 * 
	 * @author 朱建文 创建时间：2017年12月6日 下午3:50:06
	 */
	@RequestMapping("/save")
	public String saveStaff(HttpServletRequest request,SysStaff staff) {
		String returnView = list(request);
		if (isReCommit(request)) {
			return "redirect:/staff/list?flag=1";
		}
		try {
			staff.setCreateTime(new Timestamp(System.currentTimeMillis()));
			staff.setUpdateTime(new Timestamp(System.currentTimeMillis()));
			staff.setLastLoginTime(new Timestamp(System.currentTimeMillis()));
			
			// 状态
			staff.setDelFlag("0");
			staff.setUseFlag("1");
			SysStaff admin = getLoginUser(request);
			staff.setOptStaffId(admin.getRowId());
			staff.setOptStaffAccount(admin.getStaffAccount());
			String pwd = staff.getStaffPwd();
			// 用户名称不能重复 + 组织
			SysStaff staff_old = staffService.checkIsRepeat(staff.getStaffAccount());
			if (staff_old==null || staff_old.getRowId()==null) { // 不存在
				if(StringUtils.isNotBlank(pwd)){ //密码
					staff.setStaffPwd(MD5.encodeUtf8(pwd)); 
				}
				staffService.saveObj(staff);
				request.setAttribute("msg", " 添加员工成功。");
			}else{
				request.setAttribute("msg", " 添加员工失败,用户帐号重复。");
			}
		} catch (Exception e) {
			log.error("保存员工出错了", e); 
			request.setAttribute("msg", " 添加员工失败。 囧   ");
		}
		return returnView;
	}
	
	/**
	 * 修改员工
	 * 
	 * @author 朱建文 创建时间：2017年12月5日 下午8:28:13
	 */
	@RequestMapping("/update")
	public String update(HttpServletRequest request,SysStaff staff) {
		String returnView = list(request);
		try {
			staffService.updateStaff(staff);
			request.setAttribute("msg", " [修改] 员工成功。");
		} catch (Exception e) {
			log.error("保存员工出错了", e); 
			request.setAttribute("msg", " [修改] 员工失败。 囧   ");
		}
		return returnView;
	}
	
	/**
	 * 启用/停用
	 * 
	 * @author 朱建文 创建时间：2017年12月5日 下午8:27:55
	 */
	@ResponseBody
	@RequestMapping("/stop")
	public int stop(HttpServletRequest request,Long id) {
		try {
			SysStaff staff = staffService.findByPK(id);
			SysStaff admin = getLoginUser(request);
			staffService.stopStaff(staff,admin);
			if (staff.getUseFlag().equals("1")) {
				userMap.put(staff.getStaffAccount() + "userFlag", "0");
			} else {
				userMap.remove(staff.getStaffAccount() + "userFlag");
			}
			return 1;
		} catch (Exception e) {
			log.error("停用 员工出错了", e); 
			request.setAttribute("msg", " [停用] 员工失败。 囧   ");
		}
		return -1;
	}
	
	/**
	 * 删除员工
	 * 
	 * @author 朱建文 创建时间：2017年12月5日 下午8:27:45
	 */
	@ResponseBody
	@RequestMapping("/deleteStaff")
	public int deleteStaff(HttpServletRequest request,Long id) {
		try {
			SysStaff staff = staffService.findByPK(id);
			SysStaff admin = getLoginUser(request);
			if (staff.getUseFlag().equals("0")) {
				staffService.deleteStaff(admin,id);
				userMap.remove(staff.getStaffAccount() + DEL_FLAG);//清空map里边该帐号的信息
				userMap.remove(staff.getStaffAccount() + "userFlag");
				return 1;
			} else  {
				return 2;
			}
		} catch (Exception e) {
			log.error("删除员工 员工出错了", e); 
			request.setAttribute("msg", " [删除员工] 员工失败。 囧   ");
		}
		return -1;
	}
	
	
	/**
	 * 重置登录密码
	 * 
	 * @author 朱建文 创建时间：2017年12月5日 下午8:27:30
	 */
	@ResponseBody
	@RequestMapping("/resetPwd")
	public int resetPwd(HttpServletRequest request,Long id) {
		try {
			SysStaff currUser = getLoginUser(request);
			// 自己或者自己的上级可以 重置密码
			if(("1").equals(currUser.getStaffType()) ||  currUser.getRowId() == id.longValue()){
				SysStaff staff = staffService.findByPK(id);
				staff.setStaffPwd("E10ADC3949BA59ABBE56E057F20F883E");  // 默认密码 123456
				staffService.resetPwd(staff);
				return 1;
			}else{
				log.error("  管理员 或者 本人才可以重置 密码  --------------------- "); 
			}
		} catch (Exception e) {
			log.error("重置 密码    出错了", e); 
			request.setAttribute("msg", " [重置 密码] 失败。 囧   ");
		}
		return -1;
	}

	/**
	 * 修改登录密码
	 * 
	 * @author 朱建文 创建时间：2017年12月5日 下午8:27:12
	 */
	@RequestMapping("/passUpdate")
	public String passUpdate(HttpServletRequest request) {
		// 1.数据验证 oldpassword password repassword
		String returnView = "jsp/system/staff_pwd_update";
		try {
			String oldpassword = getStringValue(request, "oldpassword");
			String password = getStringValue(request, "password");
			String repassword = getStringValue(request, "repassword");
			SysStaff currUser = getLoginUser(request);
			if (StringUtils.isBlank(oldpassword)) {
				request.setAttribute("msg", "旧密码不能为空！");
				request.setAttribute("code", 1);
				return returnView;
			}
			if (StringUtils.isBlank(password)) {
				request.setAttribute("msg", "新密码不能为空!");
				request.setAttribute("code", 1);
				return returnView;
			}
			if (StringUtils.isBlank(repassword)) {
				request.setAttribute("msg", "确认密码不能为空!");
				request.setAttribute("code", 1);
				return returnView;
			}
			// 1.3新旧密码相同
			if (password.equals(oldpassword)) {
				request.setAttribute("msg", "新旧密码相同！");
				request.setAttribute("code", 1);
				return returnView;
			}
			// 1.4验证确认密码
			if (!password.equals(repassword)) {
				request.setAttribute("msg", "两次输入的密码不相同!");
				request.setAttribute("code", 1);
				return returnView;
			}
			// 2.修改密码逻辑业务
			// 2.1验证用户密码是否正确
			Query query = new Query();
			query.put("STAFF_ACCOUNT", currUser.getStaffAccount());
			SysStaff user = staffService.find(query);
			if (user == null) {
				request.setAttribute("msg", "旧密码错误!");
				request.setAttribute("code", 1);
				return returnView;
			} else {
				//需要比较的密码
				oldpassword = MD5.encodeUtf8(oldpassword);
				if (!user.getStaffPwd().equals(oldpassword)) {
					request.setAttribute("msg", "旧密码错误!");
					request.setAttribute("code", 1);
					return returnView;
				}
				password = MD5.encodeUtf8(password);
			}
			this.staffService.updatePass(user, password);
		} catch (Exception e) {
			log.error("passUpdate ---------> has error    " + e);
			request.setAttribute("msg", "修改失败!");
			request.setAttribute("code", 1);
			return returnView;
		}
		request.setAttribute("msg", "修改成功!");
		request.setAttribute("code", 1);
		return returnView;
	}
	
	/**
	 * 检查员工帐号是否重复
	 * 
	 * @author 朱建文 创建时间：2017年12月5日 下午8:26:50
	 */
	@ResponseBody
	@RequestMapping("/checkStaffAccount")
	public int checkStaffAccount(HttpServletRequest request, String staffAccount, Integer rowId){
		try {
			String phone = null;
			SysStaff staff = this.staffService.findObject(staffAccount, phone, rowId);
			if (staff != null) {
				return 1;
			}
		} catch (Exception e) {
			log.error("检查员工帐号是否重复出错了", e);
			request.setAttribute("msg", "检查员工帐号是否重复出错了!");
		}
		return 2;
	}
	
	/**
	 * 检查员工手机号是否重复
	 * 
	 * @author 朱建文 创建时间：2017年12月5日 下午8:26:59
	 */
	@ResponseBody
	@RequestMapping("/checkStaffPhone")
	public int checkStaffPhone(HttpServletRequest request, String phone, Integer rowId){
		try {
			String staffAccount = null;
			SysStaff staff = this.staffService.findObject(staffAccount, phone, rowId);
			if (staff != null) {
				return 1;
			}
		} catch (Exception e) {
			log.error("检查员工手机号是否重复出错了", e);
			request.setAttribute("msg", "检查员工手机号是否重复出错了!");
		}
		return 2;
	}
	
	/**
	 * 获取点卡客服列表
	 * 
	 * @author 朱建文 创建时间：2018年5月29日 下午1:50:47
	 */
	@ResponseBody
	@RequestMapping("/getCardKfList")
	public List<SysStaff> getCardKfList(HttpServletRequest request) {
		List<SysStaff> sysStaffList = new ArrayList<SysStaff>();
		try {
			Map<String, String> columns = new HashMap<String, String>();
			columns.put("ROW_ID", "rowId");
			columns.put("STAFF_ACCOUNT", "staffAccount");
			
			Query query = new Query();
			query.put("STAFF_TYPE", "101");
			sysStaffList = this.staffService.findList(columns, query);
		} catch (Exception e) {
			log.error("获取点卡客服列表出错！", e);
		}
		return sysStaffList;
	}
}
